import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 夜半梦中微凉
 */
public class DownloadPhoto implements PageProcessor {

    private final static Logger logger = LoggerFactory.getLogger(DownloadPhoto.class);
    // 设置参数
    private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setTimeOut(3000);
    private static List<String> requestUrl = new ArrayList<String>();

    public static void downloadPhotoFromUrl(List<String> imagePageUrls) {

        logger.info("start to download Photo From Url");
        // 遍历每个图片详情页，下载图片
        for (String imagePageUrl : imagePageUrls) {
            // 启动爬虫
            Spider.create(new DownloadPhoto())
                    // 添加初始化的URL
                    .addUrl(imagePageUrl)
                    // 使用单线程
                    .thread(1)
                    // 运行
                    .run();
        }
    }

    /**
     * 页面处理逻辑
     * 也就是访问主程序中的URL后得到的页面
     *
     * 爬虫思路：
     *      1. 主程序访问URL后得到页面
     *      2. 将得到的页面解析出需要的参数，并将解析出来并且需要爬取的链接放入爬取目标中 （45-59行）
     *          TIPS：WebMagic会自动去识别哪些连接爬取过哪些没有。
     *      3. 访问第二步中放入的链接得到页面，并解析（62行）
     *      4. 将图片的名字和后缀提取出来以便保存（64-77行）
     */
    @Override
    public void process(Page page) {

            // 将页面中图片的地址提取出来，以便于使用工具类保存
            String pageURL = "https://pic.netbian.com" + page.getHtml().xpath("//a[@id='img']/img/@src").toString();
            logger.info("pageURL: {}", pageURL);

            if (pageURL != null && pageURL.trim().length() != 0) {
                try {
                    // 获取图片的名字和后缀提取出来用于保存
                    String name = pageURL.substring(pageURL.length() - 10, pageURL.length() - 4);
                    String suffix = pageURL.substring(pageURL.length() - 4);
                    logger.debug("name: {}; suffix: {}", name, suffix);

                    // 将图片的地址、名字、保存路径传入文件工具类进行下载
                    DownloadImage.downLoadFromUrl(pageURL, name + suffix, "src/file/");
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

    }

    @Override
    public Site getSite() {
        return site;
    }
}
